home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / dosfile.r < prev    next >
Text File  |  1995-08-17  |  10KB  |  564 lines

  1.  
  2. ;---;  dosfile.r  ;------------------------------------------------------------
  3. *
  4. *    ****    DOS FILE HANDLING ROUTINES    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Add. Coding    Daniel Weber
  8. *    Version        1.12
  9. *    Last Revision    25.07.92
  10. *    Identifier    dof_defined
  11. *       Prefix        dof_    (DOS files)
  12. *                 ¯¯  ¯
  13. *    Functions    LoadFile, GetFileLength, ReadFromFile, ParseName
  14. *            WriteToFile, ReadLine, WriteLine
  15. *
  16. *    NOTE        - dosfile.r MUST be included after the easylibrary.r
  17. *              (or the startup4.r)!
  18. *
  19. ;------------------------------------------------------------------------------
  20.  
  21. ;------------------
  22.     ifnd    dof_defined
  23. dof_defined    =1
  24.  
  25. ;------------------
  26. dof_oldbase    equ __base
  27.     base    dof_base
  28. dof_base:
  29.  
  30. ;------------------
  31.  
  32.     IFD     ely_defined
  33.     IFND    DOS.LIB
  34.     FAIL    dos.library needed: DOS.LIB SET 1
  35.     ENDIF
  36.     ENDIF
  37.  
  38. ;------------------------------------------------------------------------------
  39. *
  40. * LOADFILE    Tries to load a file from disk to allocated memory.
  41. *
  42. * INPUT:    d0    Path and name of file
  43. *        d1    Amount of bytes to be allocated more before file
  44. *        d2    Amount of bytes to be allocated more at end
  45. *
  46. * RESULT:    d0    Address of memory block or 0 if error
  47. *        d1    Length of file
  48. *        d2    Length of memory block at d0
  49. *
  50. ;------------------------------------------------------------------------------
  51.  
  52.     IFD    xxx_LoadFile
  53. xxx_ReadFromFile    SET    1
  54. xxx_GetFileLength    SET    1
  55.  
  56. ;------------------
  57. LoadFile:
  58.  
  59. ;--------------------------------------------------------------------
  60. ; Get filelength, memory and read file
  61. ;
  62. \startup:
  63.     movem.l    d3-a6,-(sp)
  64.     move.l    d0,d6
  65.     move.l    d1,d3
  66.     bsr.s    GetFileLength
  67.     move.l    d0,d5
  68.     ble.s    \error
  69.  
  70. \allocmem:
  71.     move.l    4.w,a6
  72.     add.l    d3,d0
  73.     add.l    d2,d0        ;total length
  74.     move.l    d0,d4
  75.     moveq    #1,d1
  76.     jsr    -198(a6)
  77.     move.l    d0,d7
  78.     beq.s    \error
  79.  
  80. \read:
  81.     move.l    d6,d0
  82.     move.l    d7,d1
  83.     add.l    d3,d1
  84.     move.l    d5,d2
  85.     bsr    ReadFromFile
  86.     tst.l    d0
  87.     bge.s    \okay
  88.  
  89. \badread:
  90.     move.l    d7,a1
  91.     move.l    d4,d0
  92.     jsr    -210(a6)
  93.     bra.s    \error
  94.  
  95. \okay:
  96.     move.l    d7,d0
  97.     move.l    d5,d1
  98.     move.l    d4,d2
  99.     bra.s    \exit
  100.     
  101. \error:
  102.     moveq    #0,d0
  103.     moveq    #0,d1
  104.     moveq    #0,d2
  105.  
  106. \exit:    movem.l    (sp)+,d3-a6
  107.     rts
  108.  
  109.     ENDC
  110.  
  111. ;--------------------------------------------------------------------
  112.  
  113. ;------------------------------------------------------------------------------
  114. *
  115. * GETFILELENGTH    Gets filelength from a specific file.
  116. *
  117. * INPUT:    D0    Path and name of file
  118. *
  119. * OUTPUT:    D0    Length of file or -1 if error
  120. *        CCR    on D0
  121. *
  122. ;------------------------------------------------------------------------------
  123.  
  124.     IFD    xxx_GetFileLength
  125. ;------------------
  126. GetFileLength:
  127.  
  128. ;--------------------------------------------------------------------
  129. ; Open all resources: doslib and infoblock memory
  130. ;
  131. \startup:
  132.     movem.l    d1-a6,-(sp)
  133.     link    a5,#dof_length
  134.     moveq    #-1,d6            ;error
  135.     move.l    d0,d7
  136.  
  137. \opendos:
  138.     move.l    4.w,a6
  139.     IFND    ely_defined
  140.     lea    dof_dosname(pc),a1
  141.     jsr    -408(a6)
  142.     move.l    d0,dof_dosbase(a5)
  143.     beq.s    \exit
  144.     ENDC
  145.  
  146. \getinfo:
  147.     moveq    #65,d0
  148.     lsl.l    #2,d0
  149.     moveq    #1,d1
  150.     jsr    -198(a6)
  151.     move.l    d0,dof_infoblock(a5)
  152.     beq.s    \closedos
  153.  
  154. ;------------------
  155. ; get length
  156. ;
  157. \lock:
  158.     move.l    d7,d1
  159.     moveq    #-2,d2
  160.     IFD    ely_defined
  161.     move.l    DosBase(pc),a6
  162.     ELSE
  163.     move.l    dof_dosbase(a5),a6
  164.     ENDC
  165.     jsr    -84(a6)
  166.     move.l    d0,dof_lock(a5)
  167.     beq.s    \closeinfo
  168.  
  169. \examine:
  170.     move.l    d0,d1
  171.     move.l    dof_infoblock(a5),d2
  172.     jsr    -102(a6)
  173.     tst.l    d0
  174.     beq.s    \unlockfile
  175.  
  176. \getlength:
  177.     move.l    dof_infoblock(a5),a0
  178.     move.l    124(a0),d6
  179.  
  180. ;------------------
  181. ; free all
  182. ;
  183. \unlockfile:
  184.     move.l    dof_lock(a5),d1
  185.     jsr    -90(a6)
  186.  
  187. \closeinfo:
  188.     move.l    4.w,a6
  189.     move.l    dof_infoblock(a5),a1
  190.     moveq    #65,d0
  191.     lsl.l    #2,d0
  192.     jsr    -210(a6)
  193.  
  194. \closedos:
  195.     IFND    ely_defined
  196.     move.l    dof_dosbase(a5),a1
  197.     jsr    -414(a6)
  198.     ENDC
  199.  
  200. \exit:    unlk    a5
  201.     move.l    d6,d0
  202.     movem.l    (sp)+,d1-a6
  203.     rts
  204.  
  205.     ENDC
  206.  
  207. ;--------------------------------------------------------------------
  208.  
  209. ;------------------------------------------------------------------------------
  210. *
  211. * READFROMFILE    Load from a specific file a certain amount of bytes.
  212. *
  213. * INPUT:    D0    Path and name of file
  214. *        D1    Destinatio memory
  215. *        D2    Number of bytes to read
  216. *
  217. * OUTPUT:    D0    0 if all okay, -1 if error occured (CCR)
  218. *
  219. ;------------------------------------------------------------------------------
  220.     IFD    xxx_ReadFromFile
  221.  
  222. ;------------------
  223. ReadFromFile:
  224.  
  225. ;--------------------------------------------------------------------
  226. ; Open all resources: doslib and file
  227. ;
  228. \startup:
  229.     movem.l    d1-a6,-(sp)
  230.     link    a5,#dof_length
  231.     moveq    #-1,d6            ;error
  232.     move.l    d0,d7
  233.     move.l    d1,d4
  234.     move.l    d2,d5
  235.  
  236. \opendos:
  237.     IFND    ely_defined
  238.     lea    dof_dosname(pc),a1
  239.     move.l    4.w,a6
  240.     jsr    -408(a6)
  241.     move.l    d0,dof_dosbase(a5)
  242.     beq.s    \exit
  243.     ENDC
  244.  
  245. \open:    move.l    d7,d1
  246.     move.l    #1005,d2
  247.     IFD    ely_defined
  248.     move.l    DosBase(pc),a6
  249.     ELSE
  250.     move.l    dof_dosbase(a5),a6
  251.     ENDC
  252.     jsr    -30(a6)
  253.     move.l    d0,dof_lock(a5)
  254.     beq.s    \closedos
  255.  
  256. \read:
  257.     move.l    d0,d1
  258.     move.l    d4,d2
  259.     move.l    d5,d3
  260.     jsr    -42(a6)
  261.     cmp.l    d5,d0
  262.     bne.s    \closefile
  263.     moveq    #0,d6            ;okay        
  264.  
  265. \closefile:
  266.     move.l    dof_lock(a5),d1
  267.     jsr    -36(a6)
  268.  
  269. \closedos:
  270.     IFND    ely_defined
  271.     move.l    4.w,a6
  272.     move.l    dof_dosbase(a5),a1
  273.     jsr    -414(a6)
  274.     ENDC
  275.  
  276. \exit:    unlk    a5
  277.     move.l    d6,d0
  278.     movem.l    (sp)+,d1-a6
  279.     rts
  280.  
  281.     ENDC
  282.     
  283. ;--------------------------------------------------------------------
  284.  
  285. ;------------------------------------------------------------------------------
  286. *
  287. * READLINE    Load from a file one line (LF & zero as line termination)
  288. *
  289. * INPUT:    D0    filehandle (as returned by Open())
  290. *        D1    destination memory
  291. *        D2    max. number of bytes to read
  292. *
  293. * OUTPUT:    D0    +<#of bytes read> if all okay, -1 if error occured (CCR)
  294. *
  295. * NOTES:        - dosbase is accessed using DosBase(pc).
  296. *
  297. ;------------------------------------------------------------------------------
  298.     IFD    xxx_ReadLine
  299. ;------------------
  300. ReadLine:
  301.     movem.l    d1-a6,-(a7)
  302.  
  303.     move.l    d2,d3
  304.     beq.s    .out
  305.     move.l    d1,d2
  306.     move.l    d1,a2
  307.     move.l    d0,d1
  308.     move.l    d0,d4            ; filehandle
  309.     move.l    DosBase(pc),a6
  310.     jsr    -42(a6)            ; read()
  311.     move.l    d0,d2
  312.     ble.s    .out
  313.  
  314.     moveq    #$a,d1            ; line feed
  315. .loop:    move.b    (a2)+,d3
  316.     beq.s    .seek
  317.     cmp.b    d1,d3
  318.     beq.s    .seek
  319.     subq.l    #1,d2
  320.     bgt.s    .loop
  321.  
  322. .seek:    move.l    d4,d1            ;seek back to the beginning
  323.     moveq    #0,d3            ;of the next line (0= OFFSET_CURRENT)
  324.     neg.l    d2
  325.     jsr    -66(a6)            ;seek()
  326.  
  327. .out:    movem.l    (a7)+,d1-a6
  328.     rts
  329.  
  330.     ENDC
  331.  
  332. ;--------------------------------------------------------------------
  333.  
  334. ;------------------------------------------------------------------------------
  335. *
  336. * WRITELINE    Write a line to a file (LF & zero as line termination)
  337. *
  338. * INPUT:    D0    filehandle (as returned by Open())
  339. *        D1    destination memory
  340. *        D2    max. number of bytes to write
  341. *
  342. * OUTPUT:    D0    +<#of bytes wrote> if all okay, -1 if error occured (CCR)
  343. *
  344. * NOTES:        - dosbase is accessed using DosBase(pc).
  345. *
  346. ;------------------------------------------------------------------------------
  347.     IFD    xxx_WriteLine
  348. ;------------------
  349. WriteLine:
  350.     movem.l    d1-a6,-(a7)
  351.     move.l    d1,a0
  352.     moveq    #$a,d5            ; line feed
  353. .loop:    move.b    (a0)+,d4
  354.     beq.s    .write
  355.     cmp.b    d5,d4
  356.     beq.s    .write
  357.     subq.l    #1,d2
  358.     bgt.s    .loop
  359.  
  360. .write: move.l    a0,d3
  361.     sub.l    d1,d3            ; length
  362.     move.l    d1,d2            ; buffer
  363.     move.l    d0,d1            ; filehandle
  364.     move.l    DosBase(pc),a6
  365.     jsr    -48(a6)            ; write()
  366.     movem.l    (a7)+,d1-a6
  367.     rts
  368.  
  369.     ENDC
  370.     
  371. ;--------------------------------------------------------------------
  372.  
  373. ;------------------------------------------------------------------------------
  374. *
  375. * PARSENAME    Parses a filename and copies the zeroterminated result
  376. *        to another space.
  377. *
  378. * INPUT:    A0    Address of name
  379. *        A1    Destination memory
  380. *        D0    Maximal length (excluding end zero)
  381. *
  382. * OUTPUT:    A0    Next char
  383. *        A1    End of file name (after zero)
  384. *        D0    0 if okay or -1 if error
  385. *
  386. ;------------------------------------------------------------------------------
  387.     IFD    xxx_ParseName
  388. ;------------------
  389. ParseName:
  390.  
  391. ;--------------------------------------------------------------------
  392. ; read name until ' ', $9, $0 and $a or if in ' or " until same and $a
  393. ;
  394. \startup:
  395.     movem.l    d1-d7/a2-a6,-(sp)
  396.     move.l    d0,d6
  397.     moveq    #$a,d2
  398.     moveq    #$9,d3
  399.     moveq    #" ",d4
  400.  
  401. \killspaces:
  402.     move.b    (a0)+,d0
  403.     cmp.b    d3,d0
  404.     beq.s    \killspaces
  405.     cmp.b    d4,d0
  406.     beq.s    \killspaces
  407.     subq.w    #1,a0
  408.  
  409. \tryintros:
  410.     moveq    #"'",d5
  411.     cmp.b    d5,d0
  412.     beq.s    \introtype
  413.     moveq    #'"',d5
  414.     cmp.b    d5,d0
  415.     beq.s    \introtype
  416.  
  417. ;------------------
  418. ; simple type
  419. ;
  420. \simpletype:
  421.     move.b    (a0)+,d0
  422.     beq.s    \ends
  423.     cmp.b    d2,d0
  424.     beq.s    \ends
  425.     cmp.b    d3,d0
  426.     beq.s    \ends
  427.     cmp.b    d4,d0
  428.     beq.s    \ends
  429.     move.b    d0,(a1)+
  430.  
  431. \nexts:    subq.l    #1,d6
  432.     bcc.s    \simpletype
  433.  
  434. \error:    moveq    #-1,d0
  435.  
  436. \exit:    movem.l    (sp)+,d1-d7/a2-a6
  437.     rts
  438.  
  439. \ends:    subq.l    #1,a0
  440. \endi:    moveq    #0,d0
  441.     move.b    d0,(a1)
  442.     bra.s    \exit
  443.  
  444. ;------------------
  445. ; in high kommata
  446. ;
  447. \introtype:
  448.     addq.w    #1,a0
  449.  
  450. \itype:    move.b    (a0)+,d0
  451.     cmp.b    d2,d0
  452.     beq.s    \ends
  453.     cmp.b    d5,d0
  454.     beq.s    \endi
  455.     move.b    d0,(a1)+
  456.     subq.l    #1,d6
  457.     bcc.s    \itype
  458.     bra.s    \error
  459.  
  460.     ENDC
  461. ;------------------
  462.  
  463. ;------------------------------------------------------------------------------
  464. *
  465. * WRITETOFILE    save a specified amount of bytes to the given file
  466. *
  467. * INPUT:    D0    Path and name of file (newfile)
  468. *        D1    source memory
  469. *        D2    Number of bytes to write
  470. *
  471. * OUTPUT:    D0    0 if all okay, -1 if error occured (CCR)
  472. *
  473. ;------------------------------------------------------------------------------
  474.     IFD    xxx_WriteToFile
  475.  
  476. ;------------------
  477. WriteToFile:
  478.  
  479. ;--------------------------------------------------------------------
  480. ; Open all resources: doslib and file
  481. ;
  482. \startup:
  483.     movem.l    d1-a6,-(sp)
  484.     link    a5,#dof_length
  485.     moveq    #-1,d6            ;error
  486.     move.l    d0,d7
  487.     move.l    d1,d4
  488.     move.l    d2,d5
  489.  
  490. \opendos:
  491.     IFND    ely_defined
  492.     lea    dof_dosname(pc),a1
  493.     move.l    4.w,a6
  494.     jsr    -408(a6)
  495.     move.l    d0,dof_dosbase(a5)
  496.     beq.s    \exit
  497.     ENDC
  498.  
  499. \open:    move.l    d7,d1
  500.     move.l    #1006,d2        ;mode newfile
  501.     IFD    ely_defined
  502.     move.l    DosBase(pc),a6
  503.     ELSE
  504.     move.l    dof_dosbase(a5),a6
  505.     ENDC
  506.     jsr    -30(a6)
  507.     move.l    d0,dof_lock(a5)
  508.     beq.s    \closedos
  509.  
  510. \write:    move.l    d0,d1
  511.     move.l    d4,d2
  512.     move.l    d5,d3
  513.     jsr    -48(a6)            ;write
  514.     cmp.l    d5,d0
  515.     bne.s    \closefile
  516.     moveq    #0,d6            ;okay        
  517.  
  518. \closefile:
  519.     move.l    dof_lock(a5),d1
  520.     jsr    -36(a6)            ;close
  521.  
  522. \closedos:
  523.     IFND    ely_defined
  524.     move.l    4.w,a6
  525.     move.l    dof_dosbase(a5),a1
  526.     jsr    -414(a6)
  527.     ENDC
  528.  
  529. \exit:    unlk    a5
  530.     move.l    d6,d0
  531.     movem.l    (sp)+,d1-a6
  532.     rts
  533.  
  534.     ENDC
  535.     
  536. ;--------------------------------------------------------------------
  537.  
  538.  
  539. ;------------------
  540. ; dos.library
  541. ;
  542.     IFND    ely_defined
  543. dof_dosname:    dc.b "dos.library",0
  544.     even
  545.     ENDC
  546.  
  547. ;------------------
  548.     foreset
  549. dof_dosbase:        fo.l    1
  550. dof_infoblock:        fo.l    1
  551. dof_lock:        fo.l    1
  552. dof_length:        foval
  553.  
  554.     
  555.  
  556. ;------------------
  557.     base    dof_oldbase
  558.  
  559. ;------------------
  560.     endif
  561.  
  562.  end
  563.  
  564.